import xml.etree.ElementTree as ET
from xml.dom import minidom

# 读写XML文件的工具类
class XMLFileHandler:
    def __init__(self, file_path):
        self.file_path = file_path

    # 写入XML文件
    def write_xml(self, root_name, data, pretty_print=True):
        # 创建根元素
        root = ET.Element(root_name)
        
        # 递归函数，用于将数据转换为XML元素
        def build_xml_element(parent, data_item):
            if isinstance(data_item, dict):
                for key, value in data_item.items():
                    if isinstance(value, list):
                        # 处理列表类型
                        for item in value:
                            if isinstance(item, dict):
                                # 如果列表中的元素是字典，则创建子元素
                                child = ET.SubElement(parent, key)
                                build_xml_element(child, item)
                            else:
                                # 否则，直接设置值
                                child = ET.SubElement(parent, key)
                                child.text = str(item)
                    elif isinstance(value, dict):
                        # 处理嵌套字典
                        child = ET.SubElement(parent, key)
                        build_xml_element(child, value)
                    else:
                        # 处理基本类型
                        child = ET.SubElement(parent, key)
                        child.text = str(value)
            
        # 构建XML树
        build_xml_element(root, data)
        
        # 创建XML树对象
        tree = ET.ElementTree(root)
        
        if pretty_print:
            # 美化输出
            xml_str = ET.tostring(root, encoding='utf-8')
            parsed_xml = minidom.parseString(xml_str)
            pretty_xml = parsed_xml.toprettyxml(indent="  ", encoding='utf-8')
            
            # 写入文件
            with open(self.file_path, 'wb') as f:
                f.write(pretty_xml)
        else:
            # 不美化输出，直接写入
            tree.write(self.file_path, encoding='utf-8', xml_declaration=True)
        
        print(f"XML文件 '{self.file_path}' 已成功创建")

    # 读取XML文件
    def read_xml(self):
        try:
            # 解析XML文件
            tree = ET.parse(self.file_path)
            root = tree.getroot()
            
            # 递归函数，用于将XML元素转换为字典
            def parse_xml_element(element):
                result = {}
                
                # 处理子元素
                for child in element:
                    child_data = parse_xml_element(child)
                    
                    # 检查是否有相同名称的元素
                    if child.tag in result:
                        # 如果是列表，追加
                        if isinstance(result[child.tag], list):
                            result[child.tag].append(child_data)
                        else:
                            # 否则，转换为列表
                            result[child.tag] = [result[child.tag], child_data]
                    else:
                        result[child.tag] = child_data
                
                # 如果没有子元素，但有文本内容，则返回文本
                if not result and element.text and element.text.strip():
                    return element.text.strip()
                
                return result
            
            # 解析XML数据
            data = {root.tag: parse_xml_element(root)}
            print(f"已成功读取XML文件 '{self.file_path}'")
            return data
        except FileNotFoundError:
            print(f"错误：文件 '{self.file_path}' 不存在")
            return None
        except ET.ParseError:
            print(f"错误：XML文件 '{self.file_path}' 格式不正确")
            return None

    # 更新XML文件中的元素
    def update_xml_element(self, element_path, new_value):
        try:
            # 解析XML文件
            tree = ET.parse(self.file_path)
            root = tree.getroot()
            
            # 查找并更新元素
            elements_updated = 0
            for element in root.findall(element_path):
                element.text = str(new_value)
                elements_updated += 1
            
            if elements_updated > 0:
                # 保存更新后的文件
                tree.write(self.file_path, encoding='utf-8', xml_declaration=True)
                print(f"已成功更新 {elements_updated} 个元素")
                return True
            else:
                print(f"未找到路径为 '{element_path}' 的元素")
                return False
        except Exception as e:
            print(f"更新XML元素时发生错误：{str(e)}")
            return False

    # 删除XML文件中的元素
    def delete_xml_element(self, element_path):
        try:
            # 解析XML文件
            tree = ET.parse(self.file_path)
            root = tree.getroot()
            
            # 查找并删除元素
            elements_deleted = 0
            for element in root.findall(element_path):
                parent = element.getparent()
                if parent is not None:
                    parent.remove(element)
                    elements_deleted += 1
            
            if elements_deleted > 0:
                # 保存更新后的文件
                tree.write(self.file_path, encoding='utf-8', xml_declaration=True)
                print(f"已成功删除 {elements_deleted} 个元素")
                return True
            else:
                print(f"未找到路径为 '{element_path}' 的元素")
                return False
        except Exception as e:
            print(f"删除XML元素时发生错误：{str(e)}")
            return False

# 示例用法
if __name__ == '__main__':
    # 创建XML文件处理器实例
    xml_handler = XMLFileHandler('example.xml')
    
    # 示例数据
    sample_data = {
        'company': {
            'name': '科技有限公司',
            'address': '北京市朝阳区科技园',
            'contact': {
                'phone': '010-12345678',
                'email': 'contact@example.com'
            },
            'employees': [
                {
                    'employee': {
                        'id': '001',
                        'name': '张三',
                        'department': '开发部',
                        'position': '高级工程师',
                        'skills': ['Python', 'Java', 'C++']
                    }
                },
                {
                    'employee': {
                        'id': '002',
                        'name': '李四',
                        'department': '设计部',
                        'position': 'UI设计师',
                        'skills': ['Photoshop', 'Illustrator', 'Figma']
                    }
                },
                {
                    'employee': {
                        'id': '003',
                        'name': '王五',
                        'department': '市场部',
                        'position': '产品经理',
                        'skills': ['产品设计', '用户研究', '数据分析']
                    }
                }
            ]
        }
    }
    
    # 写入XML文件
    xml_handler.write_xml('root', sample_data)
    
    # 读取XML文件
    read_data = xml_handler.read_xml()
    print("读取的数据结构：")
    import json
    print(json.dumps(read_data, ensure_ascii=False, indent=2))
    
    # 更新XML元素
    xml_handler.update_xml_element('.//employee[id="001"]/department', '研发部')
    
    # 使用更简单的方式删除元素，不依赖于获取父元素
    # 我们可以直接使用Employee对象来删除其下的技能元素
    # 先读取XML文件
    tree = ET.parse(xml_handler.file_path)
    root = tree.getroot()
    
    # 查找王五的employee元素
    wangwu_employee = None
    for employee in root.findall('.//employee'):
        if employee.find('id') is not None and employee.find('id').text == '003':
            wangwu_employee = employee
            break
    
    if wangwu_employee is not None:
        # 获取王五的所有技能元素
        skills = list(wangwu_employee.findall('skills'))  # 转换为列表以便于操作
        if len(skills) >= 2:
            # 删除第二个技能元素
            wangwu_employee.remove(skills[1])
            # 保存更新后的文件
            tree.write(xml_handler.file_path, encoding='utf-8', xml_declaration=True)
            print("已成功删除王五的第二个技能")
        else:
            print("未找到足够的技能元素")
    else:
        print("未找到ID为003的员工")
    
    # 再次读取XML文件，验证更新和删除是否成功
    updated_data = xml_handler.read_xml()
    print("更新后的部分数据：")
    # 打印更新后的员工信息
    employees = updated_data['root']['company']['employees']
    for emp in employees:
        print(f"员工ID: {emp['employee']['id']}, 部门: {emp['employee']['department']}")